home *** CD-ROM | disk | FTP | other *** search
/ Plug-In Power Pack for Netscape Communicator / Plug-In Power Pack for Netscape Communicator.iso / plugins / dataviews / dvtools / demos / citydemo / c4i_main.c < prev    next >
C/C++ Source or Header  |  1997-07-10  |  6KB  |  263 lines

  1.  
  2. #ifndef lint
  3. static char SccsId[]= "@(#)c4i_main.c    V1.9    3/15/95";
  4. #endif
  5.  
  6.  
  7. /*------------------------------------------------------------------
  8. | file name -- c4i_main.c
  9. |-----------------------------------------------------------------*/
  10.  
  11. #include "std.h"
  12. #include "dvstd.h"
  13. #include "dvtools.h"
  14. #include "Tfundecl.h"
  15. #include "c4i_vars.h"
  16. #include "GRfundecl.h"
  17. #include "VUfundecl.h"
  18. #include "c4i_fundecl.h"
  19. #include "MISCfuns.h"
  20.  
  21.  
  22. #ifdef WINNT
  23. #include <windows.h>
  24. #include <crtdbg.h>
  25.  
  26. ADDRFUNPTR VEdspfunset V_P_((ADDRFUNPTR));
  27. ADDRESS C4I_ErrHandler (char *);
  28. #endif /* WINNT */
  29.  
  30.  
  31. #ifndef WINNT
  32.  
  33. /* Include the X based files so we can add AppTimeOuts */
  34. #ifdef CONST
  35. #undef CONST
  36. #endif
  37.  
  38. #ifndef __STDC__
  39. #define _NO_PROTO
  40. #endif
  41.  
  42. /* X11 include files */
  43. #include <X11/Xlib.h>
  44. #include <X11/Intrinsic.h>
  45.  
  46.  
  47.  
  48. #endif /* Not WINNT */
  49.  
  50. #define SEARCH_PATH     (CHAR*)NULL
  51. #define DISPFORM_TABLE  (CHAR*)NULL
  52.  
  53. /* This program can be linked to run:
  54. |
  55. |  With 100% CPU usage (which shows updates in a tight loop)
  56. |    comment #define DV_USE_TIMER
  57. |  With Time-Outs (which show update based on a timer.
  58. |    uncomment #define DV_USE_TIMER
  59. */
  60. #define DV_USE_TIMER 
  61.  
  62. #ifdef DV_USE_TIMER
  63. LOCAL unsigned int TimeoutInterval = 50;
  64. #ifdef WINNT
  65. LOCAL HWND Hwnd;
  66. LOCAL VOID CALLBACK TimeOutProc V_P_((HWND hwnd,
  67.                                        UINT uMsg,
  68.                                        UINT idEvent,
  69.                                        DWORD dwTime));
  70. #else /*UNIX*/
  71. LOCAL XtAppContext app_context;
  72. LOCAL VOID UpdateProc V_P_((ADDRESS args, XtIntervalId *interval_id));
  73. #endif /* WINNT */
  74. #endif /* DV_USE_TIMER */
  75.  
  76. /*--------------------------------------------------------------------
  77. |  main()
  78. |    This module is the basic skeleton of a DataViews application.
  79. |
  80. */
  81. #ifdef WINNT
  82. int APIENTRY WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
  83.                      LPSTR lpCmdLine,  int nCmdShow  )
  84. {
  85.     INT argc = 0;
  86.     CHAR **argv;
  87.  
  88.     make_argv(&argc,&argv,GetCommandLine());
  89.  
  90. #else  /* Not WINNT */
  91. int 
  92. main (argc, argv)
  93.      int argc;
  94.      char *argv[];
  95. {
  96.  
  97. #endif /* WINNT */
  98.  
  99.  
  100.   /* Initialize arguments, argv[1] - display device */
  101.   if (argc > 1)
  102.     DeviceName = argv[1];
  103.  
  104.   /* Initialize */
  105.   /* DataViews Initializaton */
  106.   VUoff_copyright ();
  107.   (VOID) TInit (SEARCH_PATH, DISPFORM_TABLE);
  108.  
  109. #ifdef WINNT
  110.   // Register a local error handler
  111.   (VOID) VEdspfunset(C4I_ErrHandler);
  112. #endif
  113.  
  114.   InitDataTable ();             /* found in c4i_rebind.c */
  115.   InitModel ();                 /* found in c4i_model.c */
  116.   InitDisplays ();              /* found in c4i_dsp.c */
  117.  
  118. #ifdef DV_USE_TIMER
  119. #ifdef WINNT
  120.     /* Get the Windows based information */
  121.     (VOID) GRget (V_WIN32_WINDOW_HANDLE, &Hwnd, V_END_OF_LIST);
  122.     
  123.  /* Post a timeout for dynamic updates
  124.   |  The timeout procedure will update the dynamics of
  125.   |  all screens which have been opened. The procedure is invoked
  126.   |  whenever the specified time interval elapses. The interval is
  127.   |  specified in milliseconds.
  128.   */
  129.     SetTimer (Hwnd, (UINT)Hwnd, TimeoutInterval, (TIMERPROC)TimeOutProc);
  130. #else /*UNIX*/
  131.   /* Extract the X information so we can setup a Time-Out Proc
  132.   |  for updating....
  133.   |     Get the Xt Application Context information.
  134.   |     Post a timeout procedure will update the dynamics of
  135.   |     all screens which have been opened. The procedure is invoked
  136.   |     whenever the specified time interval elapses. The interval is
  137.   |     specified in milliseconds.
  138.   */
  139.   (VOID) GRget (V_X_APPLIC_CONTEXT, &app_context, V_END_OF_LIST);
  140.   XtAppAddTimeOut (app_context, TimeoutInterval,
  141.            (XtTimerCallbackProc)UpdateProc, NULL);
  142. #endif /* WINNT */ 
  143. #endif /* USE TIMER */
  144.  
  145.   /* Control Loop */
  146.   ApplicationState = (DV_BOOL) RUNNING;
  147.   while (ApplicationState == RUNNING)
  148.     {
  149.  
  150.  
  151. #ifndef DV_USE_TIMER
  152.       /* Update the Display */
  153.       HandleDynamics();
  154.  
  155. #endif /* DV_USE_TIMER */
  156.            
  157.       /* Gather and Process User Inputs
  158.       |    Note: since we posted a time-out, the event
  159.       |    handler will call our function to handle
  160.       |    the updating of dynamic objects.
  161.       */
  162.       HandleEvents ();          /* found in c4i_events.c */
  163.  
  164.     }
  165.  
  166.   /* Termination and Clean Up */
  167.   TermDisplays ();              /* found in c4i_dsp.c */
  168.   TermDataTable ();             /* found in c4i_rebind.c */
  169.  
  170.   (VOID) TTerminate ();         /* DataViews Termination */
  171.  
  172.   return EXIT_OK;
  173. }
  174.  
  175. #ifdef DV_USE_TIMER
  176. #ifdef WINNT
  177.  
  178. /*ARGSUSED*/
  179. LOCAL VOID CALLBACK
  180. TimeOutProc (hwnd, uMsg, idEvent, dwTime)
  181.     HWND hwnd;
  182.   UINT uMsg;
  183.     UINT idEvent;
  184.     DWORD dwTime;
  185. {
  186.     HandleDynamics ();
  187. }
  188.  
  189. #else /*UNIX*/
  190.  
  191. /*ARGSUSED*/
  192. LOCAL VOID 
  193. UpdateProc (args, interval_id)
  194.      ADDRESS args;
  195.      XtIntervalId *interval_id;
  196. {
  197.  
  198.   /* Gather and Process Data */
  199.   HandleDynamics ();            /* found in c4i_dyn.c */
  200.  
  201.   /* Re-Post the Time-Out */
  202.   XtAppAddTimeOut (app_context, TimeoutInterval,
  203.            (XtTimerCallbackProc) UpdateProc, NULL);
  204. }
  205.  
  206. #endif /* WINNT */
  207. #endif /* DV_USE_TIMER */
  208.  
  209.  
  210. #ifdef WINNT
  211. /*
  212. Special error handler to prevent the following endless cycle: 
  213.   Error dialog pops up, Dialog gets cancelled, Expose event causes 
  214.   window redraw, which generates another error dialog.
  215.  
  216.   To break the cycle, we will only display the error message every other
  217.   time. If a different message comes in it gets displayed immediately.
  218.   If two error messages alternate, then we have a problem..
  219. */
  220.  
  221. #define ERRBUFSIZE 500
  222.  
  223. LOCAL ADDRESS C4I_ErrHandler (char *pErrStr)
  224. {
  225.     LOCAL char pLastErrStr[ERRBUFSIZE] = "";
  226.     LOCAL BOOL bDispErr = TRUE;
  227.     int nStrLen;
  228.  
  229.     _ASSERT(pErrStr != NULL);
  230.  
  231.     // See if old error message is the same as the new one. If not,
  232.     // Get its size, save it, & set bDispErr to true so that the
  233.     // message gets displayed.
  234.     if (strcmp(pLastErrStr,pErrStr) != 0)
  235.     {   
  236.         
  237.         nStrLen = strlen(pErrStr);
  238.         if (nStrLen > ERRBUFSIZE)
  239.             nStrLen = ERRBUFSIZE - 1;
  240.         strncpy(pLastErrStr,pErrStr, nStrLen);
  241.         pLastErrStr[nStrLen] = '\0';
  242.  
  243.         bDispErr = TRUE;
  244.     }
  245.  
  246.     // If bDispErr is TRUE, we either have a new message, or it is time
  247.     // to display the old one again
  248.     if(bDispErr)
  249.     {
  250.         if(MessageBox(GetFocus(), pErrStr, NULL, MB_OKCANCEL)==IDCANCEL)
  251.             S_EXIT(1);
  252.         bDispErr = FALSE;
  253.     }
  254.     else
  255.     {
  256.         bDispErr = TRUE;
  257.     }
  258.  
  259.     return NULL;
  260. }
  261.  
  262. #endif
  263.